cleardata <- data.frame(x=c("a","b","c","d"), 
                        A=c(1, NA,4,NA),
                        B=c(NA,NA,10,NA),
                        C=c(NA,NA,NA,9),
                        D=c(NA,5,NA,NA))
cleardata
  x  A  B  C  D
1 a  1  NA NA NA
2 b  NA NA NA 5
3 c  4  10 NA NA
4 d  NA NA 9  NA

LongData <- gather(cleardata, key = year, value = unemp, A:D)
   x year unemp
1  a    A     1
2  b    A    NA
3  c    A     4
4  d    A    NA
5  a    B    NA
6  b    B    NA
7  c    B    10
8  d    B    NA
9  a    C    NA
10 b    C    NA
11 c    C    NA
12 d    C     9
13 a    D    NA
14 b    D     5
15 c    D    NA
16 d    D    NA

gather(cleardata, key = year, value = unemp, A:C)

spread(LongData, key =  year, value =  unemp)
  x  A  B  C  D
1 a  1  NA NA NA
2 b  NA NA NA 5
3 c  4  10 NA NA
4 d  NA NA 9  NA

set.seed(3)
z=data.frame(sample(c("a","b","c","d","e"),20,replace=T))
names(z)="letter"
z$color=rep(0,dim(z)[1])
z
letter color
1       a     0
2       e     0
3       b     0
4       b     0
5       d     0
6       d     0
7       a     0
8       b     0
9       c     0
10      d     0
11      c     0
12      c     0
13      c     0
14      c     0
15      e     0
16      e     0
17      a     0
18      d     0
19      e     0
20      b     0

y1=c("a","b","c")
y2=c("red","blue","green")
y=data.frame(cbind(y1,y2))
names(y)=c("letter","color")
dat <- merge(z, y, by = "letter", all.x = TRUE)


manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", 
          "5/1/09")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, gender, age, 
                         q1, q2, q3, q4, q5, stringsAsFactors = FALSE)
#############################重点

leadership <- transform(leadership, {
  agecat <- NA;
  agecat[age > 75] <- "Elder";
  agecat[age >= 55 & age <= 75] <- "Middle Aged";
  agecat[age < 55] <- "Young"
})

###############管道操作符
# 导入数据
data <- mtcars
# 计算行数
n <- dim(mtcars)[1]
# 生成随机数
rdn <- runif(n = n, min = 0, max = 100)

# load package
library(tidyverse) # 或者library(magrittr) 

mtcars %>%
  dim() %>%
  pluck(1) %>%
  runif(min = 0, max = 100) -> rdn1
rdn2<- runif(n = dim(mtcars)[1], min = 0, max = 100)

#使用mtcars第一列变量的最小值控制生成随机数的最小值
# 导入数据
data <- mtcars[,1]
# 计算最小值
min <- min(data)
# 生成随机数
rdn <- runif(n = 20, min = min, max = 100)

# 使用管道操作符
mtcars %>%
  pluck(1) %>%
  min() %>%
  runif(n = 20, ., max = 100) -> rdn   ##参数不是位于第一的位置，需要额外使用占位符

当有多个参数的输入值依赖于前面代码的输出结果时，需要结合大括号{}进行使用

比如我们需要根据mtcars第一列变量的行数、最小值和最大值来控制随机数的生成：

# 不使用管道操作符
data <- mtcars[,1]
n <- length(data)
min <- min(data)
max <- max(data)
rdn <- runif(n = n, min = min, max = max)

# 使用管道操作符
mtcars %>%
  pluck(1) %>%
  {
    n = min(.)
    min = min(.)
    max = max(.)
    runif(n = n, min = min, max = max)
  } -> rdn

##我们是在使用boxplot()观察data中数据的分布状态后再决定的限制生成随机数的最小值和最大值，而不是直接使用boxplot()的输出结果，也就是中间出现了“停顿”，这时就可以使用%T>%进行改写
##%T>%后的语句结果不能以“文本”的形式输出出来，因此后面接的通常是绘图、导出数据等操作，并且这项操作并不会影响后面的语句继续继承%T>%前面语句的输出结果作为参数。
# 必须加载这个包
library(magrittr)

mtcars %>%
  pluck(1) %T>%
  boxplot() %>%
  length() %>%
  runif(min = 10, max = 35)



比如我们对data进行一系列操作后结果仍然命名为data:
  
  library(magrittr)

# 使用%>%
data <- mtcars
data %>%
  mutate(rdn = runif(n = dim(.)[1], 10, 20)) -> data
在对data进行操作后我们使用向右赋值符号->将数据仍然命名为data，如果使用%<>%可以省去这一步：

data <- mtcars
data %<>%
  mutate(rdn = runif(n = dim(.)[1], 10, 20))
需要注意以下几点：
%<>%必须接在一个变量后面，而管道操作符中途没有新的命名变量，实际上这决定了%<>%的位置必须紧接在第一行代码后，且只能使用一次；


4 %$%
  %$%传递的不是前一行的输出结果本身，而是输出数据框的列名，可以允许后一行代码直接根据列名调用相应的数据。

比如我们想根据mtcars中hp列的分布情况来控制生成随机数：

mtcars %$%
  runif(n = length(hp), min = min(hp), max = max(hp)) –> rdn
处理前后的变量必须同名。